package contable.aplicacion.contabilidad;

import contable.aplicacion.FactoriaSQL;
import contable.dominio.Cuenta;
import contable.dominio.Periodo;
import contable.dominio.Registro;
import java.util.Date;

/**
 * Se encarga de hacer los registros mas específicos
 */
public class ManejadorContable {

    public static final double IVA = 0.13;
    private FactoriaSQL fsql = FactoriaSQL.getINSTANCIA();
    private Registro registro;
    private Periodo periodo = new Periodo();

    /**
     * Registrar un deposito al banco proveniente de la caja
     * <table border="1">
     *   <tr>
     *     <th>Código</th>
     *     <th>Nombre</th>
     *     <th>Debe</th>
     *     <th>Haber</th>
     *   </tr>
     *   <tr>
     *     <td>112-000-000-000</td>
     *     <td>BANCOS</td>
     *     <td>valor</td>
     *     <td></td>
     *   </tr>
     *   <tr>
     *     <td>111-000-000-000</td>
     *     <td>CAJA</td>
     *     <td></td>
     *     <td>valor</td>
     *   </tr>
     * </table>
     *
     * @param valor El valor con que se afectará las cuentas
     */
    public void depositoBanco(double valor) {
        Cuenta bancos = new Cuenta();
        Cuenta caja = new Cuenta();
        fsql.rollback(bancos, "112-000-000-000");
        fsql.rollback(caja, "111-000-000-000");
        bancos.cargar(valor);
        caja.abonar(valor);
        fsql.commit(bancos);
        fsql.commit(caja);
        registro = new Registro(new Date(), "Se realizo un deposito al banco", valor, periodo, bancos, caja);
        fsql.commit(registro);
    }

    /**
     * Registrar los gastos de instalación incurridos
     * <table border="1">
     *   <tr>
     *     <th>Código</th>
     *     <th>Nombre</th>
     *     <th>Debe</th>
     *     <th>Haber</th>
     *   </tr>
     *   <tr>
     *     <td>152-001-000-000</td>
     *     <td>GASTOS DE INSTALACION</td>
     *     <td>valor</td>
     *     <td></td>
     *   </tr>
     *   <tr>
     *     <td>111-000-000-000</td>
     *     <td>CAJA</td>
     *     <td></td>
     *     <td>valor</td>
     *   </tr>
     * </table>
     *
     * @param valor El valor con que se afectará las cuentas
     */
    public void gastosDeInstalacion(double valor) {
        Cuenta gastosInst = new Cuenta();
        Cuenta caja = new Cuenta();
        fsql.rollback(gastosInst, "152-001-000-000");
        fsql.rollback(caja, "111-000-000-000");
        gastosInst.cargar(valor);
        caja.abonar(valor);
        fsql.commit(gastosInst);
        fsql.commit(caja);
        registro = new Registro(new Date(), "Se registro los gastos de instalación", valor, periodo, gastosInst, caja);
        fsql.commit(registro);
    }

    /**
     * Registrar gasto por reparaciones y mantenimiento de local
     * <table border="1">
     *   <tr>
     *     <th>Código</th>
     *     <th>Nombre</th>
     *     <th>Debe</th>
     *     <th>Haber</th>
     *   </tr>
     *   <tr>
     *     <td>613-018-000-000</td>
     *     <td>REPARACIONES Y MANTENIMIENTO</td>
     *     <td>valor</td>
     *     <td></td>
     *   </tr>
     *   <tr>
     *     <td>111-000-000-000</td>
     *     <td>CAJA</td>
     *     <td></td>
     *     <td>valor</td>
     *   </tr>
     * </table>
     *
     * @param valor El valor con que se afectará las cuentas
     */
    public void reparacionesMantenimiento(double valor) {
        Cuenta repaMant = new Cuenta();
        Cuenta caja = new Cuenta();
        fsql.rollback(repaMant, "613-018-000-000");
        fsql.rollback(caja, "111-000-000-000");
        repaMant.cargar(valor);
        caja.abonar(valor);
        fsql.commit(repaMant);
        fsql.commit(caja);
        registro = new Registro(new Date(), "Se registro las reparaciones y mantenimento del local", valor, periodo, repaMant, caja);
        fsql.commit(registro);
    }

    /**
     * Registrar un crédito bancario a la empresa
     * <table border="1">
     *   <tr>
     *     <th>Código</th>
     *     <th>Nombre</th>
     *     <th>Debe</th>
     *     <th>Haber</th>
     *   </tr>
     *   <tr>
     *     <td>213-001-000-000</td>
     *     <td>CREDITOS BANCARIOS</td>
     *     <td></td>
     *     <td>valor</td>
     *   </tr>
     *   <tr>
     *     <td>111-000-000-000</td>
     *     <td>CAJA</td>
     *     <td>valor</td>
     *     <td></td>
     *   </tr>
     * </table>
     *
     * @param valor El valor con que se afectará las cuentas
     */
    public void creditoBancario(double valor) {
        Cuenta creditoBancario = new Cuenta();
        Cuenta banco = new Cuenta();
        fsql.rollback(creditoBancario, "213-001-000-000");
        fsql.rollback(banco, "112-000-000-000");
        creditoBancario.abonar(valor);
        banco.cargar(valor);
        fsql.commit(creditoBancario);
        fsql.commit(banco);
        registro = new Registro(new Date(), "Se registro un nuevo credito bancario", valor, periodo, creditoBancario, banco);
        fsql.commit(registro);
    }

    /**
     * Registrar un documento por pagar
     * <table border="1">
     *   <tr>
     *     <th>Código</th>
     *     <th>Nombre</th>
     *     <th>Debe</th>
     *     <th>Haber</th>
     *   </tr>
     *   <tr>
     *     <td>221-001-000-000</td>
     *     <td>DOCUMENTOS POR PAGAR</td>
     *     <td></td>
     *     <td>valor</td>
     *   </tr>
     *   <tr>
     *     <td>112-000-000-000</td>
     *     <td>BANCOS</td>
     *     <td>valor</td>
     *     <td></td>
     *   </tr>
     * </table>
     *
     * @param valor El valor con que se afectará las cuentas
     */
    public void documentoPorPagar(double valor) {
        Cuenta documentosPorPagar = new Cuenta();
        Cuenta banco = new Cuenta();
        fsql.rollback(documentosPorPagar, "221-001-000-000");
        fsql.rollback(banco, "112-000-000-000");
        documentosPorPagar.abonar(valor);
        banco.cargar(valor);
        fsql.commit(documentosPorPagar);
        fsql.commit(banco);
        registro = new Registro(new Date(), "Se registro un documento por pagar", valor, periodo, documentosPorPagar, banco);
        fsql.commit(registro);
    }

    public void bonificaciones(double valor) {
        // TODO registrar bonificaciones por pagar
        // Cuentas afectadas                        Debe    Haber
        // 214-006-001-000 BONIFICACIONES POR PAGAR          *
        // 214-001-000-000 CUENTAS POR PAGAR         *
    }

    public void cuotaISSS(double valor) {
        // TODO registrar cuotas por pagar al ISSS
        // Cuentas afectadas                        Debe    Haber
        // 214-009-000-000 CUOTAS POR PAGAR AL ISSS          *
        // 214-001-000-000 CUENTAS POR PAGAR         *
    }

    public void cuotaAFP(double valor) {
        // TODO registrar cuotas por pagar a la AFP
        // Cuentas afectadas                       Debe    Haber
        // 214-010-000-000 CUOTAS POR PAGAR AL AFP          *
        // 214-001-000-000 CUENTAS POR PAGAR        *
    }

    public void retencionISSS(double valor) {
        // TODO registrar retenciones a empleados a ISSS
        // Cuentas afectadas                            Debe    Haber
        // 216-001-001-000 RETENCIONES A EMPLEADOS ISSS          *
        // 412-001-000-000 SUELDOS                       *
    }

    public void retencionAFP(double valor) {
        // TODO registrar retenciones a empleados a ISSS
        // Cuentas afectadas                            Debe    Haber
        // 216-007-001-000 RETENCIONES EMPLEADOS AFP             *
        // 412-001-000-000 SUELDOS                       *
    }

    public void retencionRenta(double valor) {
        // TODO registrar retencion Renta a empleados
        // Cuentas afectadas       Debe    Haber
        // 216-006-000-000 RENTA            *
        // 412-001-000-000 SUELDOS  *
    }

    public void prestaciones(double valor) {
        // TODO registrar prestaciones a empleados
        // Cuentas afectadas            Debe    Haber
        // 413-029-000-000 PRESTACIONES          *
        // 412-001-000-000 SUELDOS       *
    }

    public void incapacidad(double valor) {
        // TODO registrar incapacidades
        // Cuentas afectadas             Debe    Haber
        // 421-032-000-000 INCAPACIDADES  *
        // 111-000-000-000 CAJA                   *
    }

    /**
     * Registrar el gasto por publicidad
     * <table border="1">
     *   <tr>
     *     <th>Código</th>
     *     <th>Nombre</th>
     *     <th>Debe</th>
     *     <th>Haber</th>
     *   </tr>
     *   <tr>
     *     <td>421-013-000-000</td>
     *     <td>PUBLICIDAD</td>
     *     <td>valor</td>
     *     <td></td>
     *   </tr>
     *   <tr>
     *     <td>111-000-000-000</td>
     *     <td>CAJA</td>
     *     <td></td>
     *     <td>valor</td>
     *   </tr>
     * </table>
     *
     * @param valor El valor con que se afectará las cuentas
     */
    public void publicidad(double valor) {
        Cuenta publicidad = new Cuenta();
        Cuenta caja = new Cuenta();
        fsql.rollback(publicidad, "421-013-000-000");
        fsql.rollback(caja, "111-000-000-000");
        publicidad.cargar(valor);
        caja.abonar(valor);
        fsql.commit(publicidad);
        fsql.commit(caja);
        registro = new Registro(new Date(), "Se registro el gasto por publicidad", valor, periodo, publicidad, caja);
        fsql.commit(registro);
    }

    /**
     * Registrar el gasto por vigilancia
     * <table border="1">
     *   <tr>
     *     <th>Código</th>
     *     <th>Nombre</th>
     *     <th>Debe</th>
     *     <th>Haber</th>
     *   </tr>
     *   <tr>
     *     <td>421-021-000-000</td>
     *     <td>VIGILANCIA</td>
     *     <td>valor</td>
     *     <td></td>
     *   </tr>
     *   <tr>
     *     <td>111-000-000-000</td>
     *     <td>CAJA</td>
     *     <td></td>
     *     <td>valor</td>
     *   </tr>
     * </table>
     *
     * @param valor El valor con que se afectará las cuentas
     */
    public void vigilancia(double valor) {
        Cuenta vigilancia = new Cuenta();
        Cuenta caja = new Cuenta();
        fsql.rollback(vigilancia, "421-021-000-000");
        fsql.rollback(caja, "111-000-000-000");
        vigilancia.cargar(valor);
        caja.abonar(valor);
        fsql.commit(vigilancia);
        fsql.commit(caja);
        registro = new Registro(new Date(), "Se registro el gasto por vigilancia", valor, periodo, vigilancia, caja);
        fsql.commit(registro);
    }

    /**
     * Registrar los gastos por decoración
     * <table border="1">
     *   <tr>
     *     <th>Código</th>
     *     <th>Nombre</th>
     *     <th>Debe</th>
     *     <th>Haber</th>
     *   </tr>
     *   <tr>
     *     <td>421-039-000-000</td>
     *     <td>DECORACION</td>
     *     <td>valor</td>
     *     <td></td>
     *   </tr>
     *   <tr>
     *     <td>111-000-000-000</td>
     *     <td>CAJA</td>
     *     <td></td>
     *     <td>valor</td>
     *   </tr>
     * </table>
     *
     * @param valor El valor con que se afectará las cuentas
     */
    public void decoracion(double valor) {
        Cuenta decoracion = new Cuenta();
        Cuenta caja = new Cuenta();
        fsql.rollback(decoracion, "421-039-000-000");
        fsql.rollback(caja, "111-000-000-000");
        decoracion.cargar(valor);
        caja.abonar(valor);
        fsql.commit(decoracion);
        fsql.commit(caja);
        registro = new Registro(new Date(), "Se registro los gastos por decoración", valor, periodo, decoracion, caja);
        fsql.commit(registro);
    }

    /**
     * Registrar el ingreso por servicios ofrecidos
     * <table border="1">
     *   <tr>
     *     <th>Código</th>
     *     <th>Nombre</th>
     *     <th>Debe</th>
     *     <th>Haber</th>
     *   </tr>
     *   <tr>
     *     <td>423-002-000-000</td>
     *     <td>SERVICIOS</td>
     *     <td></td>
     *     <td>valor</td>
     *   </tr>
     *   <tr>
     *     <td>111-000-000-000</td>
     *     <td>CAJA</td>
     *     <td>valor</td>
     *     <td></td>
     *   </tr>
     * </table>
     *
     * @param valor El valor con que se afectará las cuentas
     */
    public void ingresoPorServicios(double valor) {
        Cuenta servicios = new Cuenta();
        Cuenta caja = new Cuenta();
        fsql.rollback(servicios, "423-002-000-000");
        fsql.rollback(caja, "111-000-000-000");
        servicios.abonar(valor);
        caja.cargar(valor);
        fsql.commit(servicios);
        fsql.commit(caja);
        registro = new Registro(new Date(), "Se registro un ingreso por servicios", valor, periodo, servicios, caja);
        fsql.commit(registro);
    }

    /**
     * Registrar la deuda por energía eléctrica
     * <table border="1">
     *   <tr>
     *     <th>Código</th>
     *     <th>Nombre</th>
     *     <th>Debe</th>
     *     <th>Haber</th>
     *   </tr>
     *   <tr>
     *     <td>613-014-000-000</td>
     *     <td>ENERGIA ELECTRICA</td>
     *     <td>valor</td>
     *     <td></td>
     *   </tr>
     *   <tr>
     *     <td>214-001-000-000</td>
     *     <td>CUENTAS POR PAGAR</td>
     *     <td></td>
     *     <td>valor</td>
     *   </tr>
     * </table>
     *
     * @param valor El valor con que se afectará las cuentas
     */
    public void energiaElectrica(double valor) {
        Cuenta energiaElectrica = new Cuenta();
        Cuenta cuentasPorPagar = new Cuenta();
        fsql.rollback(energiaElectrica, "613-014-000-000");
        fsql.rollback(cuentasPorPagar, "214-001-000-000");
        energiaElectrica.cargar(valor);
        cuentasPorPagar.abonar(valor);
        fsql.commit(energiaElectrica);
        fsql.commit(cuentasPorPagar);
        registro = new Registro(new Date(), "Se registro la deuda por energía eléctrica", valor, periodo, energiaElectrica, cuentasPorPagar);
        fsql.commit(registro);
    }

    /**
     * Registrar la deuda por servicio de agua
     * <table border="1">
     *   <tr>
     *     <th>Código</th>
     *     <th>Nombre</th>
     *     <th>Debe</th>
     *     <th>Haber</th>
     *   </tr>
     *   <tr>
     *     <td>613-007-000-000</td>
     *     <td>SERVICIO DE AGUA</td>
     *     <td>valor</td>
     *     <td></td>
     *   </tr>
     *   <tr>
     *     <td>214-001-000-000</td>
     *     <td>CUENTAS POR PAGAR</td>
     *     <td></td>
     *     <td>valor</td>
     *   </tr>
     * </table>
     *
     * @param valor El valor con que se afectará las cuentas
     */
    public void servicioAgua(double valor) {
        Cuenta servicioDeAgua = new Cuenta();
        Cuenta cuentasPorPagar = new Cuenta();
        fsql.rollback(servicioDeAgua, "613-007-000-000");
        fsql.rollback(cuentasPorPagar, "214-001-000-000");
        servicioDeAgua.cargar(valor);
        cuentasPorPagar.abonar(valor);
        fsql.commit(servicioDeAgua);
        fsql.commit(cuentasPorPagar);
        registro = new Registro(new Date(), "Se registro la deuda por servicio de agua", valor, periodo, servicioDeAgua, cuentasPorPagar);
        fsql.commit(registro);
    }

    /**
     * Registrar la deuda por servicio de teléfono
     * <table border="1">
     *   <tr>
     *     <th>Código</th>
     *     <th>Nombre</th>
     *     <th>Debe</th>
     *     <th>Haber</th>
     *   </tr>
     *   <tr>
     *     <td>613-028-000-000</td>
     *     <td>SERVICIO DE TELEFONO</td>
     *     <td>valor</td>
     *     <td></td>
     *   </tr>
     *   <tr>
     *     <td>214-001-000-000</td>
     *     <td>CUENTAS POR PAGAR</td>
     *     <td></td>
     *     <td>valor</td>
     *   </tr>
     * </table>
     *
     * @param valor El valor con que se afectará las cuentas
     */
    public void servicioTelefono(double valor) {
        Cuenta servicioDeTelefono = new Cuenta();
        Cuenta cuentasPorPagar = new Cuenta();
        fsql.rollback(servicioDeTelefono, "613-028-000-000");
        fsql.rollback(cuentasPorPagar, "214-001-000-000");
        servicioDeTelefono.cargar(valor);
        cuentasPorPagar.abonar(valor);
        fsql.commit(servicioDeTelefono);
        fsql.commit(cuentasPorPagar);
        registro = new Registro(new Date(), "Se registro la deuda por servicio de teléfono", valor, periodo, servicioDeTelefono, cuentasPorPagar);
        fsql.commit(registro);
    }

    /**
     * Registrar los gastos por aseo y limpieza
     * <table border="1">
     *   <tr>
     *     <th>Código</th>
     *     <th>Nombre</th>
     *     <th>Debe</th>
     *     <th>Haber</th>
     *   </tr>
     *   <tr>
     *     <td>613-026-000-000</td>
     *     <td>ASEO Y LIMPIEZA</td>
     *     <td>valor</td>
     *     <td></td>
     *   </tr>
     *   <tr>
     *     <td>111-000-000-000</td>
     *     <td>CAJA</td>
     *     <td></td>
     *     <td>valor</td>
     *   </tr>
     * </table>
     *
     * @param valor El valor con que se afectará las cuentas
     */
    public void aseoLimpieza(double valor) {
        Cuenta aseoYLimpieza = new Cuenta();
        Cuenta caja = new Cuenta();
        fsql.rollback(aseoYLimpieza, "613-026-000-000");
        fsql.rollback(caja, "111-000-000-000");
        aseoYLimpieza.cargar(valor);
        caja.abonar(valor);
        fsql.commit(aseoYLimpieza);
        fsql.commit(caja);
        registro = new Registro(new Date(), "Se registro el gasto por aseo y limpieza", valor, periodo, aseoYLimpieza, caja);
        fsql.commit(registro);
    }

    /**
     * Registrar el gasto por alquiler pagado
     * <table border="1">
     *   <tr>
     *     <th>Código</th>
     *     <th>Nombre</th>
     *     <th>Debe</th>
     *     <th>Haber</th>
     *   </tr>
     *   <tr>
     *     <td>613-027-000-000</td>
     *     <td>ALQUILERES</td>
     *     <td>valor</td>
     *     <td></td>
     *   </tr>
     *   <tr>
     *     <td>111-000-000-000</td>
     *     <td>CAJA</td>
     *     <td></td>
     *     <td>valor</td>
     *   </tr>
     * </table>
     * @param valor El valor con que se afectará las cuentas
     */
    public void alquiler(double valor) {
        Cuenta alquiler = new Cuenta();
        Cuenta caja = new Cuenta();
        fsql.rollback(alquiler, "613-027-000-000");
        fsql.rollback(caja, "111-000-000-000");
        alquiler.cargar(valor);
        caja.abonar(valor);
        fsql.commit(alquiler);
        fsql.commit(caja);
        registro=new Registro(new Date(), "Se registro el gasto por del alquiler", valor, periodo, alquiler, caja);
        fsql.commit(registro);
    }

    /**
     * Hacer un registro mas especifico que no ha sido implementado
     *
     * @param codFuente El código de la cuenta que aumentará
     * @param codSalida El código de la cuenta que disminuirá
     * @param valor El valor con que se afectará las cuentas
     */
    public void registrar(String codFuente, String codSalida, double valor) {
        Cuenta fuente = new Cuenta();
        Cuenta salida = new Cuenta();
        fsql.rollback(fuente, codFuente);
        fsql.rollback(salida, codSalida);
        switch (fuente.getRubro()) {
            case Cuenta.ACTIVO:
            case Cuenta.ACTIVO_DISPONIBLE:
            case Cuenta.ACTIVO_REALIZABLE:
            case Cuenta.ACTIVO_REALIZABLE_INVENTARIO:
            case Cuenta.ACTIVO_REALIZABLE_PAPELERIA:
            case Cuenta.ACTIVO_REALIZABLE_GASTO_PAGADOxANTICIPADO:
            case Cuenta.ACTIVO_REALIZABLE_EDIFICIO:
            case Cuenta.ACTIVO_REALIZABLE_DIFERIDO:
                fuente.cargar(valor);
                salida.abonar(valor);
                break;
            case Cuenta.ACTIVO_CONTRAACTIVO:
                fuente.abonar(valor);
                salida.cargar(valor);
                break;
            case Cuenta.ACTIVO_noCIRCULANTE_TANGIBLE:
            case Cuenta.ACTIVO_noCIRCULANTE_TANGIBLE_EDIFICIO:
            case Cuenta.ACTIVO_noCIRCULANTE_TANGIBLE_MOBILIARIO:
            case Cuenta.ACTIVO_noCIRCULANTE_INTANGIBLE:
                fuente.cargar(valor);
                salida.abonar(valor);
                break;
            case Cuenta.PASIVO:
            case Cuenta.PASIVO_CIRCULANTE:
            case Cuenta.PASIVO_CIRCULANTE_noDEVENGADO:
            case Cuenta.PASIVO_noCIRCULANTE:
            case Cuenta.PASIVO_DIFERIDO:
            case Cuenta.CAPITAL:
            case Cuenta.CAPITAL_GANADO:
            case Cuenta.CAPITAL_GANADO_INGRESO:
                fuente.abonar(valor);
                salida.cargar(valor);
                break;
            case Cuenta.CAPITAL_GANADO_EGRESO:
                fuente.cargar(valor);
                salida.abonar(valor);
                break;
        }
        fsql.commit(fuente);
        fsql.commit(salida);
        registro = new Registro(new Date(), "Se hizo el registro de las cuentas: '" + fuente.getNombre() + "' y '" + salida.getNombre() + '\'', valor, periodo, fuente, salida);
        fsql.commit(registro);
    }
}
